package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.Statement;

public class ConFactory {

	private Connection connection;
	private PreparedStatement stmt;

	public ConFactory() {
		connection = null;
		stmt = null;
	}

	private static final String URL = "jdbc:mysql://localhost:3306/caixa_eletronico";
	private static final String USUARIO = "root";
	private static final String SENHA = "ifpbinfo";

	// estabelecer conexão com o banco de dados
	public void beginConnection() throws SQLException, ClassNotFoundException {

		System.out.println("Estabelecendo conexão...");

		// registrar driver do mysql
		Class.forName("com.mysql.jdbc.Driver");

		System.out.println("MySQL JDBC Driver Registrado!");

		// tenta estabelecer conexão com o banco específico
		this.connection = DriverManager.getConnection(URL, USUARIO, SENHA);
		System.out.println("Conexão estabelecida com o banco de dados SQL!");

	}

	// encerrar conexão com banco de dados
	public void terminateConnection() throws SQLException {

		if (this.stmt != null)
			this.stmt.close();

		if (this.connection != null)
			this.connection.close();

		this.stmt = null;
		this.connection = null;

		System.out.println("Conexão encerrada!!");

	}

	// recuperar chave primária gerada
	private int getGenerateKey(PreparedStatement stmt) throws SQLException {

		int key = 0;

		// recuperar a chave
		ResultSet rs = stmt.getGeneratedKeys();

		// recuperar a chave como inteiro
		if (rs.next()) {
			key = rs.getInt(1);
		}

		return key;

	}

	public int createTuple(String sql) throws SQLException,
			ClassNotFoundException {

		// iniciar conexão
		this.beginConnection();

		// prepara conexão para execução
		this.stmt = (PreparedStatement) this.connection.prepareStatement(sql);

		// executar o comando SQL para criar nova tupla
		this.stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);

		// retorna chave primária gerada
		int id = getGenerateKey(stmt);

		// fechar conexão
		this.terminateConnection();

		return id;

	}

	public ResultSet readTuples(String sql) throws SQLException,
			ClassNotFoundException {

		// iniciar conexão
		this.beginConnection();

		// prepara conexão pra execução
		this.stmt = (PreparedStatement) connection.prepareStatement(sql);

		// executar o comando SQL para fazer consulta ao banco
		ResultSet rs = this.stmt.executeQuery(sql);

		// fechar conexão
		this.terminateConnection();

		return rs;

	}

	public void updateTuple(String sql) throws SQLException,
			ClassNotFoundException {

		// iniciar conexão
		this.beginConnection();

		// prepara conexão pra execução
		this.stmt = (PreparedStatement) connection.prepareStatement(sql);

		// executar comando SQL
		this.stmt.execute();

		// fechar conexão
		this.terminateConnection();

	}

	public void deleteTuple(String sql) throws SQLException,
			ClassNotFoundException {

		// iniciar conexão
		this.beginConnection();

		// prepara conexão pra execução
		this.stmt = (PreparedStatement) connection.prepareStatement(sql);

		// executar comando SQL
		this.stmt.execute();

		// fechar conexão
		this.terminateConnection();

	}

	public Connection getConnection() {
		return connection;
	}

	public PreparedStatement getStmt() {
		return stmt;
	}

	public void setStmt(PreparedStatement stmt) {
		this.stmt = stmt;
	}

}